import jwt from "jsonwebtoken";
import { Request, Response, NextFunction, Errback } from "express";

// 导出用于JWT签名的密钥
export const secretKey = "secretFromLineo";
// 导出用于刷新令牌签名的密钥
export const refreshSecretKey = "refreshSecretFromLineo";

/**
 * 生成访问令牌
 * @param {unknown} str - 令牌载荷中的名称字段
 * @returns {string} 签名后的访问令牌
 */
export function getToken(str: unknown) {
    return jwt.sign({ name: str }, secretKey, {
        expiresIn: 60 * 60 * 2,
    });
}

/**
 * 生成刷新令牌
 * @param {string} id - 用户ID，用作令牌载荷中的唯一标识
 * @returns {string} 签名后的刷新令牌
 */
export function getRefreshToken(id: string) {
    return jwt.sign({ id }, refreshSecretKey, {
        expiresIn: 60 * 60 * 24 * 7,
    });
}

/**
 * JWT错误处理中间件
 * @param {Errback} err - 错误对象
 * @param {Request} req - Express请求对象
 * @param {Response} res - Express响应对象
 * @param {NextFunction} next - Express下一个中间件函数
 */
export const jwtError = (err: Errback, req: Request, res: Response, next: NextFunction) => {
    if (err.name === "UnauthorizedError") {
        // 如果错误为未授权错误，则返回401未认证的响应
        return res.send({
            code: 401,
            message: "无效的token",
        });
    }
    // 对于其他错误，返回500服务器错误的响应
    res.send({
        code: 500,
        message: "未知的错误",
    });
};
